/* Includes ------------------------------------------------------------------*/
#include <main.h>

/* Private define-------------------------------------------------------------*/
//左右两个数码管显示寄存器地址宏定义
#define Disp_Position_Left      Disp_SFR_Addr_00H
#define Disp_Position_Right     Disp_SFR_Addr_02H
/* Private variables----------------------------------------------------------*/
uint8_t Disp_SEG[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};   //数码管显示0 ~ 9

static void TM1620_Write_Byte(uint8_t );
static void TM1620_Init();
static void Disp_Tempareture();
/* Public variables-----------------------------------------------------------*/
TM1620_t idata TM1620 = 
{
    Brightness_level_3,
    TM1620_Init,
    Disp_Tempareture
};
/* Private function prototypes------------------------------------------------*/

/*
* @name   TM1620_Write_Byte
* @brief  TM1620写入一个字节
* @param  dat：待写入数据
* @retval None   
*/
static void TM1620_Write_Byte(uint8_t dat)
{
    uint8_t i = 0;
    STB = 0;
    Public.Delay_ms(1);   //需要加延时等待，不然数码管显示会出异常
    for(i=0;i<8;i++)
    {
        //CLK为低电平时往DIN上放数据
        CLK = 0;
		DIN = 0x01 & (dat>>i);  //先取出最低位进行发送，然后dat右移，把最低位移出去，再取补上地低位进行发送
        _nop_();    //延时1us
        
        //CLK为高电平时TM1620读取DIN上的数据
        CLK = 1;
        _nop_();    //延时1us
    }
}

/*
* @name   TM1620_Init
* @brief  TM1620初始化
* @param  None
* @retval None   
*/
static void TM1620_Init()
{
    uint8_t i = 0;

    //喂狗
    WatchDog.Feed();

    //设置显示模式：6位8段
    TM1620_Write_Byte(Disp_Mode_GRID6_SEG8);
    STB = 1;

    //设置地址模式：自动地址增加
    TM1620_Write_Byte(Write_Data_Addr_Auto_Add);
    STB = 1;

    //清除显示寄存器，厂商要求
    TM1620_Write_Byte(Disp_SFR_Addr_00H);
    for(i=0;i<Disp_SFR_Addr_Num;i++)
    {
        TM1620_Write_Byte(0x00);
    }
    STB = 1;

    //显示默认辉度：level3
    TM1620_Write_Byte(TM1620.Brightness);
    STB = 1;

    //设置显示模式：6位8段
    TM1620_Write_Byte(Disp_Mode_GRID6_SEG8);
    STB = 1;

    //设置地址模式：固定地址
    TM1620_Write_Byte(Write_Data_Addr_Fix);
    STB = 1;

    //写显示寄存器
    //先设置位选，设置为左边的数码管，再写入段选的数据0xFF，数码管8个段全亮
    TM1620_Write_Byte(Disp_Position_Left);
    TM1620_Write_Byte(0xFF);
    STB = 1;
    //然后设置位选为右边的数码管，同样写入段选数据0xFF,8个段全亮
    TM1620_Write_Byte(Disp_Position_Right);
    TM1620_Write_Byte(0xFF);
    STB = 1;

    //显示辉度
    TM1620_Write_Byte(TM1620.Brightness);
    STB = 1;
}

/*
* @name   Disp_Tempareture
* @brief  数码管显示温度
* @param  None
* @retval None   
*/
static void Disp_Tempareture()
{
    uint8_t temp = 0;
    
    //因为获取到的温度是浮点型，而数码管只有两位，不够显示，所以要转为无符号整型数据
    temp = (uint8_t)NTC.fTemperature;

    //喂狗
    WatchDog.Feed();

    TM1620_Write_Byte(Disp_Position_Left);  //选择左边的数码管
    TM1620_Write_Byte(Disp_SEG[temp/10]);   //取出温度值的十位作为下标去找段码表对应的段选数据
    STB = 1;

    TM1620_Write_Byte(Disp_Position_Right); //选择右边的数码管
    TM1620_Write_Byte(Disp_SEG[temp%10]);   //取出温度值的个位作为下标去找段码表对应的段选数据
    STB = 1;
    
    //显示辉度
    TM1620_Write_Byte(TM1620.Brightness);
    STB = 1;
}
/********************************************************
  End Of File
********************************************************/